
#include <ppconsul/agent.h>
#include <ppconsul/consul.h>
#include <ppconsul/health.h>
#include <thread>

#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <arpa/inet.h>
using namespace ppconsul;

void get_linux_ip(const char* iface) {
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    struct ifreq ifr;
    ifr.ifr_addr.sa_family = AF_INET;
    strncpy(ifr.ifr_name, iface, IFNAMSIZ-1);

    ioctl(fd, SIOCGIFADDR, &ifr);
    close(fd);

    printf("%s IP: %s\n", 
           iface, 
           inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr));
}
int main() {
    get_linux_ip("eth0");
    
    // 初始化Consul客户端（默认连接本地8500端口）
    Consul consul("http://127.0.0.1:8500");
    
    // 获取Agent接口
    agent::Agent agent(consul);

    // 注册服务（带健康检查）
    agent.registerService(
        agent::kw::name = "web-service",    //服务名称
        agent::kw::port = 8080,               //服务端口，表示该服务运行在8080端口    
        agent::kw::tags = {"http", "production"},
        agent::kw::check = agent::TtlCheck(std::chrono::seconds(20))  
        //TtlCheck(...) 是一种基于 TTL 的健康检查机制，表示服务必须在指定时间内上报心跳，否则标记为不健康
    );

    // 发现服务
    auto services = agent.services();
    for (const auto& svc : services) {
        std::cout << "Discovered service: " << svc.first << std::endl;
    }

    std::thread t = std::thread([&](){
        while(true){
            // 发送心跳
            agent.pass("service:web-service");
            std::this_thread::sleep_for(std::chrono::seconds(10));
        }
    });

    t.join();
}
